package main

import "fmt"

func printSlice(s []int) {
	// 发现长度不够的时候  cap的空间系统是翻倍的开通的
	fmt.Printf("s = %v, len = %d, cap = %d\n", s, len(s), cap(s))
}

func main() {

	var s []int // 定义切片，默认值是 nil

	fmt.Println("", s == nil)

	for i := 0; i < 18; i++ {
		printSlice(s)
		s = append(s, 2*i+1)
	}
	fmt.Println("s =", s)

	s1 := []int{2, 4, 6, 8} // 没有 ... 表示的是创建了数组之后切片了
	printSlice(s1)

	// 创建一个知道长度不知道内容的 slice,默认值全是0
	s2 := make([]int, 16)
	printSlice(s2)
	s3 := make([]int, 16, 128)
	printSlice(s3)

	// 复制
	copy(s3, s1) // s1 复制到 s3 上
	printSlice(s3)

	// 删除,s3的第三个元素
	s3 = append(s3[:3], s3[4:]...) // ...能展开slice，append可以接受不定参
	printSlice(s3)

	// shift，推出首个
	front := s3[0]
	fmt.Println("front =", front)
	s3 = s3[1:]
	printSlice(s3)

	// pop，推出最后一个
	tail := s3[len(s3)-1]
	fmt.Println("tail =", tail)
	s3 = s3[:len(s3)-1]
	printSlice(s3)

}
